package com.projects.modular.system.utils;

import com.alibaba.fastjson.JSONObject;
import com.projects.modular.system.model.WeChatMiniProgramSession;
import lombok.extern.slf4j.Slf4j;

/**
 * 微信小程序工具类
 */
@Slf4j
public class WeChatMiniProgramUtil {
    
    /**
     * 微信小程序登录接口地址
     */
    private static final String WECHAT_MINI_PROGRAM_LOGIN_URL = 
            "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
    
    /**
     * 通过微信登录凭证code获取用户会话信息
     * 
     * @param appId 小程序appId
     * @param appSecret 小程序appSecret
     * @param code 登录时获取的code，可通过wx.login获取
     * @return WeChatMiniProgramSession 微信会话信息
     */
    public static WeChatMiniProgramSession code2Session(String appId, String appSecret, String code) {
        // 构建请求URL
        String requestUrl = String.format(WECHAT_MINI_PROGRAM_LOGIN_URL, appId, appSecret, code);
        
        try {
            // 发送GET请求
            String response = HttpClientUtil.doGet(requestUrl);
            
            // 解析响应结果
            JSONObject jsonObject = JSONObject.parseObject(response);
            
            // 检查是否有错误码
            if (jsonObject.containsKey("errcode") && jsonObject.getIntValue("errcode") != 0) {
                log.error("微信小程序登录凭证校验失败，错误码：{}，错误信息：{}", 
                        jsonObject.getIntValue("errcode"), jsonObject.getString("errmsg"));
                return null;
            }
            
            // 构建会话对象
            WeChatMiniProgramSession session = new WeChatMiniProgramSession();
            session.setOpenid(jsonObject.getString("openid"));
            session.setSessionKey(jsonObject.getString("session_key"));
            session.setUnionid(jsonObject.getString("unionid"));
            session.setErrcode(jsonObject.getInteger("errcode"));
            session.setErrmsg(jsonObject.getString("errmsg"));
            
            return session;
        } catch (Exception e) {
            log.error("微信小程序登录凭证校验异常", e);
            return null;
        }
    }
}